www.gusucode.com > 基于控制台的VC++ 图书管理系统-源码程序 > 基于控制台的VC++ 图书管理系统-源码程序/code/图书管理系统/book.cpp

    //Download by http://www.NewXing.com
//******************************************************************************************
//        这里的是有关书库管理的几个函数,包括添加,修改,删除和查找书的信息
//******************************************************************************************

#include "BookData.h"
#include "First.h"

//显示一本书的信息

void BookData::Show(void)
{
    cout<<setw(20)<<"ISBN:      "         <<isbn<<endl;
	cout<<setw(20)<<"书名:      "         <<bookTitle<<endl;
	cout<<setw(20)<<"作者:      "         <<author<<endl;
	cout<<setw(20)<<"出版社:    "         <<publisher<<endl;
    cout<<setw(20)<<"进书日期:  "         <<dateAdded<<endl;
    cout<<setw(20)<<"库存量:    "         <<qtyOnHand<<" 本"<<endl;
    cout<<setw(20)<<"零售价:    "         <<retail<<" 元"<<endl;
}

//添加书的函数

void Add(void)
{
	fstream file;
    BookData book;                         //临时变量
	char flag;                         //判断是否继续添加的标置
	char isbn[14],bookTitle[51],author[31],publisher[31],
		 sdataAdded[11],date[9],sdate[9],sq[10],get[8];//存放输入量的临时值
	int sqty;                          //存放输入的库存量
	float swholesale,sretail;          //存放输入的批发价与零售价

    file.open("bookfile.dat",ios::in|ios::out|ios::binary);
    if(!file){
		cout<<"书库文件打开失败。\n";
		exit(0);
	}
	
    file.seekp(0L,ios::end);           //写指针移到文件末尾
	cout<<"你想添加书吗?(Y/N):";
	cin>>flag;
    while(flag=='Y')
	{   
	    cout<<"请输入ISBN号:";
        GetInt(13,13,isbn);
		book.setISBN(isbn);

		cout<<"请输入书名(不超过50个字符):";
	    GetString(50,bookTitle);
        book.setTitle(bookTitle);

	    cout<<"请输入作者:";
        GetString(30,author);
		book.setAuthor(author);

        cout<<"请输入出版单位:";
        GetString(30,publisher);
		book.setPublisher(publisher);

	    cout<<"请输入进书的日期(以YYYY-MM-DD的形式写):";
        GetDate(date);
		while(!boolDate(date))     //判断日期是否合法
		{
			cout<<"请重新输入:";
			GetDate(date);
		}
		while(true)                      //判断日期是否在系统日期之后
		{
			//获取系统日期
			char date[30];
			_strdate(date);

			sdate[0]=sdataAdded[5];
			sdate[1]=sdataAdded[6];
			sdate[3]=sdataAdded[8];
			sdate[4]=sdataAdded[9];
			sdate[6]=sdataAdded[2];
			sdate[7]=sdataAdded[3];
			sdate[2]='/';
            sdate[5]='/';
			sdate[8]='\0';
			if (strcmp(sdate,date)>0) {
				cerr<<"日期错误!今天才"<<date<<"(月/日/年)"<<endl;
			    cerr<<"请重新输入:";
				GetDate(sdataAdded);
			}
			else break;
		}
		book.setDateAdded(sdataAdded);

		cerr<<"请输入库存量:";
        GetInt(10,0,sq);
		sqty=atoi(sq);
		book.setQty(sqty);

		cerr<<"请输入批发价:";
        GetFloat(get);
		swholesale=(float)atof(get);
		book.setWhole(swholesale);

        cerr<<"请输入零售价:";
        GetFloat(get);
	    sretail=(float)atof(get);	
		book.setRetail(sretail);

	    file.write((char*)&book,sizeof(book));            //写入文件
        system("cls");
     
		cerr<<"你所添加的书的信息是:\n";
		book.Show();

		cerr<<"还想继续添加吗?(Y/N):";
		cin>>flag;
	    cin.ignore(80,'\n');
        while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
		{
	 	    cerr<<"请输入Y/N:";
		    cin>>flag;
	        cin.ignore(80,'\n');
		}	
	}
	
	if ((flag=='n')||(flag=='N')) {file.flush();file.close();}
}

//查找书的信息

//1、实现模糊查询

int BookData::Match(int list,char look[])
{
	int i,j,k;
    
	//按书名
	if (list==1) {
		for(i=0;i<=(int)(strlen(bookTitle)-strlen(look));i++)
		{
		   for(k=i,j=0;((bookTitle[k]==look[j])&&(look[j]!='\0'));k++,j++);
	           if(look[j]=='\0') 
				   return 1;
           if ((bookTitle[k]==look[j])&&(bookTitle[k]!='\0')) 
			   return 1;
		}
        return 0;
	}

	//按ISBN号
	else{	    
		for(i=0;i<=(int)(strlen(isbn)-strlen(look));i++)
		{
		    for(k=i,j=0;((isbn[k]==look[j])&&(look[j]!='\0'));k++,j++);
				if(look[j]=='\0') 
					return 1;
			if ((isbn[k]==look[j])&&(look[j]=='\0'))
				return 1;
		}
        return 0;
	}
}

//2.实现查找

void LookUp(void)
{
	char choice,flag;                                //choice获得ISBN号查询与书名查询选择结果
	char look[51],clear[51]={0};
	int site,count,i;                                //计数
	Sale book;
	fstream file;

    file.open("bookfile.dat",ios::in|ios::out|ios::binary);
    if(!file){
		cerr<<"书库文件打开失败。\n";
		exit(0);
	}

	cerr<<"你想查找书吗?(Y/N):";
	cin>>flag;
	cin.ignore(80,'\n');
    while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
    {
		cerr<<"请输入Y/N:";
		cin>>flag;
	    cin.ignore(80,'\n');
	}

	while((flag=='y')||(flag=='Y'))
	{
	  cerr<<"使用ISBN号查找或使用书名查找?(I/N)";
	  cin>>choice;
	  cin.ignore(80,'\n');
      while((choice!='I')&&(choice!='N')&&(choice!='i')&&(choice!='n'))
	  {
		  cerr<<"请输入I/N:";
		  cin>>choice;
	      cin.ignore(80,'\n');
	  }

	  switch(choice)
	  {
      //按ISBN号查找
	  case 'i':
	  case 'I':  cerr<<"请输入要查找的ISBN号:";
		         GetInt(13,0,look);
				 count=0;                                 //计数清零
                 file.seekg(0L,ios::beg);
			     for(i=0;!file.eof();i++)
				 {
					 book.setISBN(clear);                 //在显示完了之后把ISBN号清零,避免重复输出
			         file.read((char*)&book,sizeof(book));//从文件中读一个书的信息
                     site=book.Match(2,look);             //判断要查找的书是否存在
                     if (site==1) {cerr<<"您要查找的书是:"<<count+1<<"\n";
						           book.Show();
			                       cerr<<endl;
                                   getch();
			                       count++;
								   if ((count%2)==0) system("cls");     //分屏显示
					 }
				 }
			     if (count==0) {cerr<<"对不起,书库中无此书!";
				                getch();
				 }
			     else {cerr<<"共找到"<<count<<"本书。";
				                getch();
				 }
			     system("cls");
                 cerr<<"还要查找吗?(Y/N)";
		     	 cin>>flag;
			     cin.ignore(80,'\n');
                 while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
				 {
		             cerr<<"请输入Y/N:";
		             cin>>flag;
	                 cin.ignore(80,'\n');
				 }
                 break;  
	  //按书名查找	 
	  case 'n':
      case 'N':  cerr<<"请输入要查找的书名:";
		         GetString(51,look);
                 file.seekg(0L,ios::beg);
			     for(i=0;!file.eof();i++)
				 {
					 book.setTitle(clear);
			         file.read((char*)&book,sizeof(book));//从文件中读一个书的信息
                     site=book.Match(1,look);
                     if (site==1) {cerr<<"您要查找的书是:"<<i+1<<"\n";
						           book.Show();
								   getch();
			                       cerr<<endl;
			                       count++;
								   if ((count%2)==0) system("cls");
					 }
				 }
			     if (count==0) {cerr<<"对不起,书库中无此书!";
				                getch();
				 }
			     else {cerr<<"共找到"<<count<<"本书。";
				                getch();
				 }

			     system("cls");
                 cerr<<"还要查找吗?(Y/N)";
		     	 cin>>flag;
			     cin.ignore(80,'\n');
                 while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
				 {
		             cerr<<"请输入Y/N:";
		             cin>>flag;
	                 cin.ignore(80,'\n');
				 }
                   break;                        
	  }
	}
	file.close();
}

//修改书的信息

void Edit(void)
{
	char news[14],sdate[9];                  //临时变量
	int site,i,newss;
	float ne;
	char choice,flag;
	long post;
    fstream file;
	Sale book;

    file.open("bookfile.dat",ios::in|ios::out|ios::binary);
    if(!file){
		cerr<<"书库文件打开失败。\n";
		exit(0);
	}

    cerr<<"你想修改书吗?(Y/N):";
	cin>>flag;
	cin.ignore(80,'\n');
    while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
    {
		cerr<<"请输入Y/N:";
		cin>>flag;
	    cin.ignore(80,'\n');
	}

	while((flag=='y')||(flag=='Y'))
	{
    	cerr<<"请输入要修改的ISBN号:";
    	GetInt(13,13,news);

        file.seekg(0L,ios::beg);
	    for(i=0;!file.eof();i++)
		{
	        file.read((char*)&book,sizeof(book));//从文件中读一个书的信息
            site=book.Match(2,news);             //判断要修改的书是否存在
            if (site==1) {cerr<<"您要修改的书的信息是:\n";
			              book.Show();
		                  cerr<<endl;
                          post=file.tellg();     //得到读指针的位置
			              break;
			}
		}
		if (site==0) {cerr<<"对不起,找不到您要修改的书!";
		              getch();
		}

	    if (site==1) 
		{
	    	cerr<<"1.ISBN号;  2.书名;  3.作者;  4.出版社;\n5.进书日期;6.库存量;7.批发价;8.零售价;9.所有\n";
		    cerr<<"请选择要修改的内容:\n";
	    	cin>>choice;
	    	cin.ignore(80,'\n');

		   while((choice>'9')||(choice<'1'))
		   {
     		    cerr<<"对不起,您输入的不是1-9之间的数! 请输入1-9之间的数:";
		    	cin>>choice;
				cin.ignore(80,'\n');
		   }

            system("cls");
	    	switch(choice)
			{
		        case '1':cerr<<"\n原来的ISBN号为"<<book.getISBN()<<endl;
			             cerr<<"请输入新的ISBN号:";
			        	 GetInt(13,13,news);
                         book.setISBN(news);
		         		 break;                        //设置新的ISBN号
	        	case '2':cerr<<"\n原来的书名为"<<book.getTitle()<<endl;
			             cerr<<"请输入新的书名:";
			        	 GetString(50,news);
                         book.setTitle(news);
			        	 break;                        //设置新的书名
	        	case '3':cerr<<"\n原来的作者为"<<book.getAuthor()<<endl;
			             cerr<<"请输入新的作者:";
			         	 GetString(30,news);
                         book.setAuthor(news);
			        	 break;                        //设置新的作者
	        	case '4':cerr<<"\n原来的出版社为"<<book.getPublisher()<<endl;
			             cerr<<"请输入新的出版社:";
				         GetString(30,news);
                         book.setPublisher(news);
	  		        	 break;                        //设置新的出版社
		        case '5':cerr<<"\n原来的进书日期为"<<book.getDateAdded()<<endl;
		 	             cerr<<"请输入新的进书日期:";
			        	 GetDate(news);
						 while(!boolDate(news))
						 {
			                 cerr<<"请重新输入:";
			                 GetDate(news);
						 }
						 while(true)
						 {
							//获取系统日期
							char date[30];
							_strdate(date);

							sdate[0]=news[5];
							sdate[1]=news[6];
							sdate[3]=news[8];
							sdate[4]=news[9];
							sdate[6]=news[2];
							sdate[7]=news[3];
							sdate[2]='/';
							sdate[5]='/';
							sdate[8]='\0';
							if (strcmp(sdate,date)>0) {
							cerr<<"日期错误!今天才"<<date<<"(月/日/年)"<<endl;
							cerr<<"请重新输入:";
							GetDate(news);
							}
							else break;
						 }
                         book.setDateAdded(news);
			        	 break;                        //设置新的进书日期
	           	case '6':cerr<<"\n原来的库存量为"<<book.getQty()<<endl;
			             cerr<<"请输入新的库存量:";
			        	 GetInt(10,0,news);
                         newss=atoi(news);
                         book.setQty(newss);
			        	 break;                        //设置新的库存量
	        	case '7':cerr<<"\n原来的批发价为"<<book.getWhole()<<endl;
			             cerr<<"请输入新的批发价:";
			        	 GetFloat(news);
                         ne=(float)atof(news);
                         book.setWhole(ne);
			        	 break;                        //设置新的批发价
	        	case '8':cerr<<"\n原来的零售价为"<<book.getRetail()<<endl;
			             cerr<<"请输入新的零售价:";
		        		 GetFloat(news);
						 ne=(float)atof(news);
                         book.setRetail(ne);
			        	 break;                       //设置新的零售价                 
				case '9':cerr<<"请输入新的ISBN号:\n";
			        	 GetInt(13,13,news);
                         book.setISBN(news);

                         cerr<<"请输入新的书名:";
			        	 GetString(50,news);
                         book.setTitle(news);

			             cerr<<"请输入新的作者:";
			         	 GetString(30,news);
                         book.setAuthor(news);

			             cerr<<"请输入新的出版社:";
				         GetString(30,news);
                         book.setPublisher(news);

                         cerr<<"请输入新的进书日期:";
			        	 GetDate(news);
                         while(!boolDate(news))
						 {
		                  	 cerr<<"请重新输入:";
			                 GetDate(news);
						 }
						 while(true)
						 {
							//获取系统日期
							char date[30];
							_strdate(date);

							sdate[0]=news[5];
							sdate[1]=news[6];
							sdate[3]=news[8];
							sdate[4]=news[9];
							sdate[6]=news[2];
							sdate[7]=news[3];
							sdate[2]='/';
							sdate[5]='/';
							sdate[8]='\0';
							if (strcmp(sdate,date)>0) {
							cerr<<"日期错误!今天才"<<date<<"(月/日/年)"<<endl;
							cerr<<"请重新输入:";
							GetDate(news);
							}
							else break;
						 }
  
                         book.setDateAdded(news);

			             cerr<<"请输入新的库存量:";
			        	 GetInt(10,0,news);
						 newss=atoi(news);
                         book.setQty(newss);

			             cerr<<"请输入新的批发价:";
			        	 GetFloat(news);
						 ne=(float)atof(news);
                         book.setWhole(ne);
						  
			             cerr<<"请输入新的零售价:";
		        		 GetFloat(news);
                         ne=(float)atof(news);
                         book.setRetail(ne);
						 break;                        //设置新的全部信息

			}
            
			cerr<<"修改成功!";
			getch();
		}
        file.seekp(post-sizeof(book),ios::beg);
        file.write((char*)&book,sizeof(book));         //写入文件
		system("cls");
		cerr<<"还要再修改吗?(Y/N):";
		cin>>flag;
        cin.ignore(80,'\n');
        while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
		{
		    cerr<<"请输入Y/N:";
		    cin>>flag;
	        cin.ignore(80,'\n');
		}
	}
	file.flush();
	file.close();
}

//删除书的信息

void Delete(void)
{
    fstream file;
	Sale book;
	char fflag,flag;
    char dele[14];
	int i,site;
	long post;

    file.open("bookfile.dat",ios::in|ios::out|ios::binary);
    if(!file){
		cerr<<"书库文件打开失败。\n";
		exit(0);
	}
    cerr<<"你想删除书吗?(Y/N):";
	cin>>flag;
	cin.ignore(80,'\n');
    while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
    {
		cerr<<"请输入Y/N:";
		cin>>flag;
	    cin.ignore(80,'\n');
	}
    while((flag=='y')||(flag=='Y'))
	{  
		cerr<<"请输入要删除的ISBN号:";
    	GetInt(13,13,dele);

        file.seekg(0L,ios::beg);
	    for(i=0;!file.eof();i++)
		{
	        file.read((char*)&book,sizeof(book));           //从文件中读一个书的信息
            site=book.Match(2,dele);                        //判断要删除的函数是否存在
            if (site==1) {cerr<<"您要删除的书的信息是:\n";
			              book.Show();
		                  cerr<<endl;
						  getch();
                          post=file.tellg();
			              break;
			}
		}
        if (site==1)
		{
		    cerr<<"\n确定要删除吗?(Y/N):";
		    cin>>fflag;
	        cin.ignore(80,'\n');
            while((fflag!='y')&&(fflag!='Y')&&(fflag!='n')&&(fflag!='N'))
			{
		        cerr<<"请输入Y/N:";
		        cin>>fflag;
	            cin.ignore(80,'\n');
			}

		    if ((fflag=='y')||(fflag=='Y')) {book.removebook();
		                                     file.seekp(post-sizeof(book),ios::beg);
                                             file.write((char*)&book,sizeof(book));//写入文件
		                                     cerr<<"删除成功!";
										     getch();
			}
            else {cerr<<"删除取消!"<<endl;
		          getch();
			}
		}
		else {cerr<<"对不起,您要删除的书找不到!";
		      getch();
		}

	    system("cls");
		cerr<<"还要再删除吗?(Y/N):";
		cin>>flag;
        cin.ignore(80,'\n');
        while((flag!='y')&&(flag!='Y')&&(flag!='n')&&(flag!='N'))
		{
		    cerr<<"请输入Y/N:";
		    cin>>flag;
	        cin.ignore(80,'\n');
		}
	}
	file.close();
}